/**
 * Created by Administrator on 2015/6/5.
 */
//duplex双工流：既可以自定义读，也可以自定义写

var fs=require('fs');
var util=require('util');
var stream=require('stream');
/*让自定义的ZfDuplex方法继承Duplex方法*/
function ZfDuplex(){
    stream.Duplex.call(this);
}
//继承，让ZfDuplex继承stream.Duplex
util.inherits(ZfDuplex,stream.Duplex);

/*扩展write方法*/
ZfDuplex.prototype._write=function(chunk,encoding,cb){
    //chunk是数据，在write中需要自己去消费数据，而push相当于push进来的数据
    //将chunk进来的数据进行输出
    console.log(chunk.toString());
    cb();
};

/*扩展read方法，用ZfReadStream在原型上进行扩展*/
ZfDuplex.prototype._read=function(){
    var content=fs.readFileSync('./2.txt');//实现读取文件
    this.push(content); //this.push是一个内部数组，也就是一个新定义的buffer对象，
    //放到自己内部的数组中，里面放到是读取到的值
    //源码中实际的写法是：state.buffer.push(chunk); chunk是数据
    this.push(null); //表示放数据已经结束。
}

var zfDuplex=new ZfDuplex();
//pipe是一个可读 可写的流中，
//把./1.txt读到zfDuplex流中。
//再把zfDuplex流中的数据，写到其他文件中。
fs.createReadStream('./1.txt').pipe(zfDuplex)
    .pipe(fs.createWriteStream('./11.txt'));

/*
* 输出结果过程分析：
* 1.首先执行读流fs.createReadStream把1.txt中的数据pipe到zfDuplex中
*   而zfDuplex又是作为写流而存在的。如何写呢，就要执行上面的_write方法进行写：
*   在_write方法中chunk就是读取到1.txt中的内容。所以在_write方法中输出chunk的内容就是1.txt中的内容。
* 2.接着又把流中的数据pipe到11.txt中了，pipe又是作为一个读流而存在的，
*   读流调用的是_read方法，在_read方法中把在./2.txt中用readFileSync
*   方法读到的数据this.push数组中。
*   createWriteStream是在缓冲区中去写的，所以返回的数据时缓冲区中this.push的内容到11.txt中。
* */

/*
* read的时候可以把数据放到this.push 中，而write中则不能。
* 因为write是一个输出的过程，把数据读出来，所以不能往this.push中添加数据
*
* */













